//: [Previous](@previous)

/*:
 # 希尔排序 增量版插入排序
 * 最好情况 O(nLog^2n))
 * 最坏情况 O(nLog^2n))
 * 平均时间复杂度 O(nLogn))
 * 空间复杂度 0(1)
 
 1. 选择一个增量序列 t1，t2，……，tk，其中 ti > tj, tk = 1；
 2. 按增量序列个数 k，对序列进行 k 趟排序；
 3. 每趟排序，根据对应的增量 ti，将待排序列分割成若干长度为 m 的子序列，分别对各子表进行直接插入排序。仅增量因子为 1 时，整个序列作为一个表来处理，表长度即为整个序列的长度。
 
 */

import Foundation

var numbers = [3, 6, 5, 2, 7, 9, 1, 4, 3]
print("排序前 \(numbers)")

func shellSort(_ arr: [Int]) -> [Int] {
    if arr.count < 2 {
        return arr
    }
    
    var nums = arr
    var gap = nums.count / 3
    gap = gap > 0 ? gap : 1
    
    while gap > 0 {
        
        for i in gap..<nums.count {
            
            var j = i
            let temp = nums[i]
            
            while j - gap >= 0 && temp < nums[j-gap] {
                nums[j] = nums[j-gap]
                j -= gap
            }
            
            if j != i {
                nums[j] = temp
            }
        }
        
        gap = gap / 3
    }
    
    return nums
}

print("希尔排序后 \(shellSort(numbers))")

//: [Next](@next)
